<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Funktsioonide vaikimisi sisendparameetrite väärtused</title>
    </head>
    <body>
        <?php
            /*
             * Funktsioonide sisendparameetritele saab vaikimisi määrata
             * väärtusi, mida funktsioon kasutab siis, kui antud funktsiooni 
             * väljakutsuja on kas unustanud funktsiooni sisendparameetrid ette anda
             * või ta tahab nimme kasutada juba vaikimisi eeldefineeritud
             * sisendparameetrite väärtusi.
             * 
             * Oletame, et meil on järgnevalt tegemist mingi funktsiooniga, mida 
             * kasutab näiteks Volvo esinduses töötav programm. Teame, et programmi 
             * kasutaja sisestab suure enamuse kordadest auto nimena funktsiooni 
             * parameetritesse just nimelt auto nime "Volvo" (oletame, et vahel 
             * müüakse esinduses ka teist marki kasutatud autosid, aga enamasti 
             * siiski vaid Volvosid). Et kasutaja ei peaks
             * nii palju üht ja sama väärtust trükkima, võtamegi järgmises 
             * näitefunktsioonis appi vaikimisi sisendparameetri väärtuse defineerimise
             * võimaluse. 
             * 
             * Tähele tuleb panna aga seda, et vaikimisi väärtused oleks funktsiooni
             * sisendparameetrites viimasel kohal!!!
             * Põhjust demonstreerime hiljem 
             */
             
             //Olgu süsteemi kujutaldavaks "andmebaasiks" järgnev massiiv, kuhu
             //tööline andmeid salvestab
             $autodeAndmed = array();
             
             //Funktsioon, mille abil töötaja "andmebaasi" andmeid sisestab on järgmine:
             function sisestaAutoAndmedSysteemi( 
                     $varv, $mootoriVoimsus, $VIN_Kood, $esmaseRegistreerimiseAasta,
                     $markus, $autoMark = "Volvo")
             {
                 //Paneme sisestatud andmed omakorda massiivi
                 $sisendandmed = array();
                 //Meetod array_push($massiiviNimiKuhuVäärtusiLisada, Väärtus1,...,Väärtus_n)
                 //abil saab konkreetsesse massiivi andmeid lisada. Antud juhul lisame
                 //loodud massiivi $sisendandmed kõik ühe auto kohta saadud info
                 array_push($sisendandmed, $autoMark, $varv, $mootoriVoimsus, 
                         $VIN_Kood, $esmaseRegistreerimiseAasta, $markus);
                 
                 //Lisame ühe auto kohta loodud massiivi omakorda "andmebaasi"
                 //ehk globaalsesse massiivi $autodeAndmed
                 array_push($GLOBALS['autodeAndmed'], $sisendandmed);
                 
                 //Me ei tagasta (returni) funktsiooni poolt midagi, sest kõik
                 //mida me funktsioonilt tahame ongi see, et ta lihtsalt sisndandmed 
                 //kusalegi ette öeldud massiivi lisaks
             }
             
             /*Lisame "andmebaasi" käsitsi mõned algandmed (seda eelnevalt defineeritud
              * funktsiooni välja kutsudes ja parameetritele väärtusi pannes. 
              * Pane tähele, et esimesel kahel juhul on funktsiooni väljakutsesse
              * sisestatud 5 parameetrit, kuigi funktsiooni definitsioonis on neid 6.
              * Nimelt, kui vaikimisi väärtusega defineeritud sisendparameeter
              * on nõuetekohaselt funktsiooni definitsioonis viimasele kohale asetatud,
              * teab php interpretaator automaatselt, et kui vaikimisi parameetri
              * asemel midagi ei sisestata, väljastab see antud juhul
              * väärtuse "Volvo"
              */
             sisestaAutoAndmedSysteemi('sinine', '110kW', 'LJCPCVLCX11000237', 2008, 'Märkusi pole');
             
             sisestaAutoAndmedSysteemi('kollane', '85kW', 'LJCPCVLCX11300237', 2011, 'Märkusi pole');
             //Kui tahame mõne teise margi vaikimisi väärtuse "Volvo" asemel sisestada, 
             //lisame ka 6-nda parameetri
             sisestaAutoAndmedSysteemi('roheline', '50kW', 'LJCPCVLCX11008237', 1985, 'Märkusi pole', 'Lada');
             
             
             /*
              * Kui väljastame "andmebaasis" olevad andmed näeme, et auto nimi Volvo
              * on esimese kahe auto andmete puhul lisandunud automaatselt
              */
             var_dump($autodeAndmed);
             
             
             
             
             
             
             /*
              * Säärane vaikimisi väärtuste lisamine funktsiooni funktsiooni 
              * sisendparameetrite viimasteks parameetriteks on aga piiratud
              * võimalustega. Nimelt, oletame, et meil on olukord, kus 
              * funktsiooni definitsioonis on kõik sisendparameetrid vaikimisi 
              * väärtusega. Mis siis, kui tahaksime muuta näiteks vaid teise 
              * parameetri vaikimisi väärtust millekski muuks, esimese ja viimase
              * parameetri jätta aga vaikimisi väärtuse peale?
              * 
              * Toome selle kohta näite
              */
             function valjastaVarvid($parameeter1 = 'kollane', $parameeter2 = 'punane', 
                     $parameeter3 = 'roheline')
             {
                 echo $parameeter1 . ', ' . $parameeter2 . ' ja ' . $parameeter3 . '.';
             }
             //Lihtsalt funktsiooni välja kutsudes saaksime väljundiks: kollane, punane ja roheline.
             valjastaVarvid();
             
             /*Oletame, et tahan vaid vaikimisi väärtuse punane ära muuta, teised
             *samaks jätta. Loogika ütleb, et kuna need väärtused on vaikimisi
              * kirjutatud, siis peaks funktsiooni kuidagi nii välja kutsuma:
              * 
              * valjastaVarvid( , 'pruun', ); 
              * 
              * Nii see aga ei ole.
              * 
              * Edukad muutmise võimalused oleks vaid järgnevad:
              * valjastaVarvid();  //kõik väärtused kuvatakse vaikimisi
              * valjastaVarvid('TahanMuuta1');   //muudetakse vaid esimest värvi, teised väljastatakse vaikimisi samaks
              * valjastaVarvid('TahanMuuta1', 'TahanMuuta2'); //muudetakse esimest kaht värvi, kolmas tuleb väljundisse vaikimisi roheline
              * 
              * Niipea, kui tahame läbi viia muid kombinatsioone, kaotame vaikimisi
              * defineeritud omadused ning sama vaikeväärtuse säilitamiseks oleme 
              * sunnitud sisendparameetri väärtuse üle kirjutama. 
              * 
              * Oletame, et tahame näiteks viia läbi muudatust
              * valjastaVarvid('eiTahaMuuta', 'eiTahaMuuta', 'TahanMuuta3');
              * 
              * Sellises olukorras tuleb esimesed kaks sisendparameetrit ikkagi
              * funktsiooni väljakutses uuesti väärtustada, missiis, et neil 
              * vaikimisi väärtused on s.t.
              * valjastaVarvid('kollane', 'punane', 'uusVarvMidaMuutsin');
              * 
              * Täpsemalt seletame probleemi lahti tunnis, kuid, kes näiteks puudus
              * ja probleemist konkreetsemalt aru sai, siis lahenduse leiab siit:
              * http://stackoverflow.com/questions/9541776/php-function-ignore-some-default-parameters
              * 
             */   
        ?>
    </body>
</html>
